# 装饰器 与 函数注册
'''
在事件驱动系统中（如GUI框架、游戏引擎），经常需要将函数注册为特定事件的处理器。请实现一个装饰器 @on(event_type)，使得被装饰的函数能自动注册到全局事件分发器中。具体要求：
1. 核心功能：
  ○ 使用 @on("click") 装饰的函数，会被记录为处理 "click" 事件的处理器
  ○ 调用 trigger("click") 时，自动执行所有注册的 "click" 事件处理器
  ○ 允许同一事件类型注册多个处理器（按装饰顺序执行）
2. 额外要求：
  ○ 支持向事件处理器传递参数（如 trigger("click", x=100, y=200)）
  ○ 处理器执行顺序与装饰器注册顺序一致
'''
import time
quan_ju_shi_jian = {}

def on(event_type):
    def decorator(func):
        if event_type not in quan_ju_shi_jian:
            # quan_ju_shi_jian[event_type] = {time.time():func}
            quan_ju_shi_jian[event_type] = [func]
        else:
            # quan_ju_shi_jian[event_type][time.time()] = func
            quan_ju_shi_jian[event_type].append(func)  #这里用列表就可以了，非要用字典
        return func
    return decorator

# def trigger(event_type,**kwargs):
#     events_func_dict = quan_ju_shi_jian[event_type]
#     s = sorted(events_func_dict.items())
#     for i in s:
#         i[1](**kwargs)

# 全局事件注册表

def trigger(event_type, *args, **kwargs):
    """触发事件，执行所有注册的处理器"""
    handlers = quan_ju_shi_jian.get(event_type, [])
    for handler in handlers:
        handler(*args, **kwargs)
    
# 定义事件处理器
@on("click")
def handle_click_a(x, y):
    print(f"A处理点击事件: 坐标({x}, {y})")

@on("click")
def handle_click_b(x, y):
    print(f"B处理点击事件: 坐标({x}, {y})")

@on("keypress")
def handle_key(key):
    print(f"按下按键: {key}")

# 触发事件
trigger("click", x=100, y=200)  # 应输出 A和B的处理信息
trigger("keypress", key="Enter") # 输出按键处理信息